package com.version1_1.dao.implement;

import com.SQLGroup.SQLAccess;
import com.util.property.Properties;
import com.version1_1.dao.SubscriDao;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by reeves on 2015/8/23.
 */

@Repository
public class SubscriDaoImpl implements SubscriDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    /*创建log4j对象*/
    private static final Logger LOGGER = Logger.getLogger(SubscriDaoImpl.class);

    /**
     * @param number
     * @return
     * @description: 获取热门分类对象列表
     * @title: getHostSortationList
     */
    @Override
    public List getHostSortationList(int number) {

        String sql = ""; //SQL语句
        int count = 0; //分类总数
        int paginateNum = 0; //分页总数



        /*分类总数*/
        sql = "SELECT COUNT(*) FROM type_info";
        count = jdbcTemplate.queryForObject(sql, Integer.class);

        if (count % Properties.HotSortationNum == 0) {
            paginateNum = count / Properties.HotSortationNum;
        } else {
            paginateNum = count / Properties.HotSortationNum + 1;
        }

        /*允许number无限增长*/
        if ((number - 1) * Properties.HotSortationNum >= count) {
            number = number % paginateNum;
        }

        List typeInfoList = jdbcTemplate.queryForList(SQLAccess.SelectTypeInfoByCollectNumber, new Object[]{(number - 1) * Properties.HotSortationNum, Properties.HotSortationNum});

        if (typeInfoList.size() == 0) {
            LOGGER.error("获取热门分类错误,typeInfoList.size为0...");
            return null;
        }

        return typeInfoList;
    }

    /**
     * 获取推荐界面信息列表
     *
     * @param pageNumber
     * @return
     */
    @Override
    public List getSubscriPageList(int pageNumber, int pageSize) {
        @SuppressWarnings("deprecation")
        int count = jdbcTemplate.queryForInt(SQLAccess.SelectRecommendCount);

        /*如果用户请求的分页数*/
        if ((pageNumber - 1) * pageSize >= count) {
            LOGGER.info("获取推荐界面信息列表,用户请求分页数过大...");
            return null;
        }

        return jdbcTemplate.queryForList(SQLAccess.SelectRecommendInfo, new Object[]{(pageNumber - 1) * pageSize, pageSize});
    }


    /**
     * 获取推荐信息列表，新的接口
     *
     * @return
     */
    public Map<String, Object> getSubscriPageList() {
        //TODO: 获取推荐界面信息列表

        Map<String, Object> recomMap = new HashMap<>();

        String sqlStr = "";

        /**
         * table page_recommend（pageId,pageDate,firstTitle,typeId,readNumber,imageSrc2,secondType,thirdTypeName,recomPos）
         */

        // 1. 获取精选信息列表（条件：recomPos=2、3、4）
        List<Map<String,Object>> chosenList = new ArrayList<>();
        for(int i=2;i<=4;i++){
            sqlStr = "SELECT pageId,imageSrc2 AS imageSrc,firstTitle,secondType,thirdTypeName,recomPos FROM page_recommend WHERE recomPos=? ORDER BY pageDate DESC LIMIT 1";
            List tempList = jdbcTemplate.queryForList(sqlStr,i);

            if (tempList.isEmpty()) {
                LOGGER.error("获取精选信息列表,取得的chosenList为空");
            }
            chosenList.addAll(tempList);

        }


        // 2. 获取整合信息列表（条件：recomPos=5、6、7、8、9）
        List<Map<String,Object>> confirmList = new ArrayList<>();
        for(int i=5;i<=9;i++){
            sqlStr = "SELECT pageId,imageSrc2 AS imageSrc,firstTitle,secondType,thirdTypeName,recomPos FROM page_recommend WHERE recomPos=? ORDER BY pageDate DESC LIMIT 1";
            List tempList = jdbcTemplate.queryForList(sqlStr,i);

            if (tempList.isEmpty()) {
                LOGGER.error("获取精选信息列表,取得的chosenList为空");
            }
            confirmList.addAll(tempList);

        }


        // 3. 获取Break信息列表（条件：recomPos=11、13、15、17、19）
        List<Map<String,Object>> breakList = new ArrayList<>();
        for(int i=5;i<=9;i++){
            sqlStr = "SELECT pageId,imageSrc2 AS imageSrc,firstTitle,secondType,thirdTypeName,recomPos FROM page_recommend WHERE recomPos=? ORDER BY pageDate DESC LIMIT 1";
            List tempList = jdbcTemplate.queryForList(sqlStr,2*i+1);

            if (tempList.isEmpty()) {
                LOGGER.error("获取精选信息列表,取得的chosenList为空");
            }
            breakList.addAll(tempList);

        }


        // 4. 获取专题信息列表（条件：recomPos=10、12、14、16、18、20）
        /*获取专题1的列表*/
        sqlStr = "SELECT pageId,imageSrc2 AS imageSrc,firstTitle,readNumber,secondType,thirdTypeName FROM page_recommend WHERE recomPos=10 AND pageDate=CURDATE()";
        List subject1List = jdbcTemplate.queryForList(sqlStr);
        if (subject1List.isEmpty()) {
            LOGGER.error("获取专题一信息列表，取得subject1List为空");
        }

        /*获取专题2的列表*/
        sqlStr = "SELECT pageId,imageSrc2 AS imageSrc,firstTitle,readNumber,secondType,thirdTypeName FROM page_recommend WHERE recomPos=12 AND pageDate=CURDATE()";
        List subject2List = jdbcTemplate.queryForList(sqlStr);
        if (subject2List.isEmpty()) {
            LOGGER.error("获取专题二信息列表，取得subject1List为空");
        }

        /*获取专题3的列表*/
        sqlStr = "SELECT pageId,imageSrc2 AS imageSrc,firstTitle,readNumber,secondType,thirdTypeName FROM page_recommend WHERE recomPos=14 AND pageDate=CURDATE()";
        List subject3List = jdbcTemplate.queryForList(sqlStr);
        if (subject3List.isEmpty()) {
            LOGGER.error("获取专题三信息列表，取得subject1List为空");
        }

        /*获取专题4的列表*/
        sqlStr = "SELECT pageId,imageSrc2 AS imageSrc,firstTitle,readNumber,secondType,thirdTypeName FROM page_recommend WHERE recomPos=16 AND pageDate=CURDATE()";
        List subject4List = jdbcTemplate.queryForList(sqlStr);
        if (subject4List.isEmpty()) {
            LOGGER.error("获取专题四信息列表，取得subject1List为空");
        }

        /*获取专题5的列表*/
        sqlStr = "SELECT pageId,imageSrc2 AS imageSrc,firstTitle,readNumber,secondType,thirdTypeName FROM page_recommend WHERE recomPos=18 AND pageDate=CURDATE()";
        List subject5List = jdbcTemplate.queryForList(sqlStr);
        if (subject5List.isEmpty()) {
            LOGGER.error("获取专题五信息列表，取得subject1List为空");
        }

        /*获取专题6的列表*/
        sqlStr = "SELECT pageId,imageSrc2 AS imageSrc,firstTitle,readNumber,secondType,thirdTypeName FROM page_recommend WHERE recomPos=20 AND pageDate=CURDATE()";
        List subject6List = jdbcTemplate.queryForList(sqlStr);
        if (subject6List.isEmpty()) {
            LOGGER.error("获取专题六信息列表，取得subject1List为空");
        }


        // 5. 各个固定的图片的名称：
        //    精选-整合间隔图片：chosen-confirm-break.jpg;
        //    整合-专题间隔图片：confirm-subject-break.jpg;
        //    专题1大图：subject1.jpg;
        //    专题2大图：subject2.jpg;
        //    专题3大图：subject3.jpg;
        //    专题4大图：subject4.jpg;
        //    专题5大图：subject5.jpg;
        //    专题6大图：subject6.jpg;

        recomMap.put("chosenList", chosenList);
        recomMap.put("confirmList", confirmList);
        recomMap.put("breakList", breakList);
        recomMap.put("subject1List", subject1List);
        recomMap.put("subject2List", subject2List);
        recomMap.put("subject3List", subject3List);
        recomMap.put("subject4List", subject4List);
        recomMap.put("subject5List", subject5List);
        recomMap.put("subject6List", subject6List);

        return recomMap;
    }




    /**
     * 获取推荐信息列表，新的接口
     *
     * @return
     */
    public Map<String, Object> getNewSubscriPageList() {
        //TODO: 获取推荐界面信息列表

        Map<String, Object> recomMap = new HashMap<>();

        String sqlStr = "";

        /**
         * table page_recommend（pageId,pageDate,firstTitle,typeId,readNumber,imageSrc2,secondType,thirdTypeName,recomPos）
         */

        // 1. 获取精选信息列表（条件：recomPos=2、3、4）
        List<Map<String,Object>> chosenList = new ArrayList<>();
        for(int i=2;i<=4;i++){
            List tempList = jdbcTemplate.queryForList(SQLAccess.SelectChosenRecommendInfo,i);

            if (tempList.isEmpty()) {
                LOGGER.error("获取精选信息列表,取得的chosenList为空");
            }
            chosenList.addAll(tempList);

        }


        // 2. 获取整合信息列表（条件：recomPos=5、6、7、8、9）
        List<Map<String,Object>> confirmList = new ArrayList<>();
        for(int i=5;i<=9;i++){
            List tempList = jdbcTemplate.queryForList(SQLAccess.SelectConformRecommendInfo,i);

            if (tempList.isEmpty()) {
                LOGGER.error("获取精选信息列表,取得的chosenList为空");
            }
            confirmList.addAll(tempList);
        }


        // 3. 获取Break信息列表（条件：recomPos=11、13、15、17、19）
        List<Map<String,Object>> breakList = new ArrayList<>();
        /*for(int i=5;i<=9;i++){
            List tempList = jdbcTemplate.queryForList(SQLAccess.SelectBreakRecommendInfo,2*i+1);

            if (tempList.isEmpty()) {
                LOGGER.error("获取精选信息列表,取得的chosenList为空");
            }
            breakList.addAll(tempList);

        }*/

        List tempList = jdbcTemplate.queryForList(SQLAccess.SelectBreakRecommendInfo,11);
        breakList.addAll(tempList);

        tempList = jdbcTemplate.queryForList(SQLAccess.SelectBreakRecommendInfo,17);
        breakList.addAll(tempList);

        tempList = jdbcTemplate.queryForList(SQLAccess.SelectBreakRecommendInfo,13);
        breakList.addAll(tempList);

        tempList = jdbcTemplate.queryForList(SQLAccess.SelectBreakRecommendInfo,19);
        breakList.addAll(tempList);

        tempList = jdbcTemplate.queryForList(SQLAccess.SelectBreakRecommendInfo,15);
        breakList.addAll(tempList);


        // 4. 获取专题信息列表（条件：recomPos=10、12、14、16、18、20）
        /*获取专题1的列表*/
        List subject1List = jdbcTemplate.queryForList(SQLAccess.SelectSubject1RecommendInfo);
        if (subject1List.isEmpty()) {
            LOGGER.error("获取专题一信息列表，取得subject1List为空");
        }

        /*获取专题2的列表*/
        List subject2List = jdbcTemplate.queryForList(SQLAccess.SelectSubject2RecommendInfo);
        if (subject2List.isEmpty()) {
            LOGGER.error("获取专题二信息列表，取得subject1List为空");
        }

        /*获取专题3的列表*/
        List subject3List = jdbcTemplate.queryForList(SQLAccess.SelectSubject3RecommendInfo);
        if (subject3List.isEmpty()) {
            LOGGER.error("获取专题三信息列表，取得subject1List为空");
        }

        /*获取专题4的列表*/
        List subject4List = jdbcTemplate.queryForList(SQLAccess.SelectSubject4RecommendInfo);
        if (subject4List.isEmpty()) {
            LOGGER.error("获取专题四信息列表，取得subject1List为空");
        }

        /*获取专题5的列表*/
        List subject5List = jdbcTemplate.queryForList(SQLAccess.SelectSubject5RecommendInfo);
        if (subject5List.isEmpty()) {
            LOGGER.error("获取专题五信息列表，取得subject1List为空");
        }

        /*获取专题6的列表*/
        List subject6List = jdbcTemplate.queryForList(SQLAccess.SelectSubject6RecommendInfo);
        if (subject6List.isEmpty()) {
            LOGGER.error("获取专题六信息列表，取得subject1List为空");
        }


        // 5. 各个固定的图片的名称：
        //    精选-整合间隔图片：chosen-confirm-break.jpg;
        //    整合-专题间隔图片：confirm-subject-break.jpg;
        //    专题1大图：subject1.jpg;
        //    专题2大图：subject2.jpg;
        //    专题3大图：subject3.jpg;
        //    专题4大图：subject4.jpg;
        //    专题5大图：subject5.jpg;
        //    专题6大图：subject6.jpg;

        recomMap.put("chosenList", chosenList);
        recomMap.put("confirmList", confirmList);
        recomMap.put("breakList", breakList);
        recomMap.put("subject1List", subject1List);
        recomMap.put("subject2List", subject2List);
        recomMap.put("subject3List", subject3List);
        recomMap.put("subject4List", subject4List);
        recomMap.put("subject5List", subject5List);
        recomMap.put("subject6List", subject6List);

        return recomMap;
    }


    /**
     * 获取推荐界面大图信息列表
     *
     * @return
     */
    @Override
    public List<Map<String, Object>> getSubscriTitleList() {
        //TODO: 获取推荐界面大图信息列表
        //大图信息数组
        List<Map<String, Object>> titleList = null;

        try {
            titleList = jdbcTemplate.queryForList(SQLAccess.SelectRecommendSlidInfo, new Object[]{Properties.RecomTitlePic_Num});
        } catch (EmptyResultDataAccessException exception) {
            LOGGER.error("获取推荐界面大图信息列表,未查询到大图信息,EmptyResultDataAccessException...", exception);
        }
        return titleList;
    }

    /**
     * 订阅单独的三级分类
     *
     * @param userId
     * @param secondType
     * @param thirdTypeName
     * @return
     */
    @Override
    public boolean subscriThirdType(int userId, int secondType, String thirdTypeName) {
        String sqlStr = "";
        int firstType = -1;
        String userFocusListStr = "";

        /**
         * 1. 查找三级分类所属的一级分类id
         */
        try {
            sqlStr = "SELECT firstType FROM type_info WHERE secondType=? AND thirdTypeName=?";
            firstType = jdbcTemplate.queryForObject(sqlStr, new Object[]{secondType, thirdTypeName}, Integer.class);
        } catch (EmptyResultDataAccessException exception) {
            LOGGER.error("订阅单独的三级分类出错,找不到此三级分类的id,secondType: " + secondType + ",thirdTypeName: " + thirdTypeName);
            return false;
        }

        /**
         * 2. 根据userId获得用户关注字符串
         */
        try {
            sqlStr = "SELECT userFocusId FROM user_info WHERE userId=?";
            userFocusListStr = jdbcTemplate.queryForObject(sqlStr, new Object[]{userId}, String.class);
        } catch (EmptyResultDataAccessException exception) {
            LOGGER.error("订阅单独的三级分类出错,根据userId找不到用户,userId: " + userId);
            return false;
        }

        /**
         * 3. 把分类添加到用户的关注列表里面
         */
        String jsonStr = "{\"secondType\":" + secondType + ",\"thirdName\":\"" + thirdTypeName + "\"}";
        JSONObject thirdTypeJsonObject = JSONObject.fromObject(jsonStr); // 更新的三级分类Json对象
        JSONObject userFocusJsonObject = JSONObject.fromObject(userFocusListStr); // 用户关注Json对象
        JSONArray userFocusJsonArray = userFocusJsonObject.getJSONArray("focusList");

        for (int i = 0; i < userFocusJsonArray.size(); i++) {
            JSONObject firstFocusObject = userFocusJsonArray.getJSONObject(i); // 用户某一级分类关注Json对象
            int itemNumber = firstFocusObject.getInt("itemNumber");
            // 如果找到要更新的一级分类
            if (itemNumber == firstType) {
                JSONArray focusJsonArray = firstFocusObject.getJSONArray("focus"); // 用户在该一级分类下的关注Json数组
                if (focusJsonArray.toString().contains(thirdTypeName)) {
                    // 如果用户已经关注了该三级分类,这种情况本不该存在的
                    return false;
                }

                /**
                 * 4. 更新该一级分类下的关注项目
                 */
                focusJsonArray.add(thirdTypeJsonObject);
                sqlStr = "UPDATE user_info SET userFocusId=? WHERE userId=?";
                int flectRows = jdbcTemplate.update(sqlStr, new Object[]{userFocusJsonObject.toString(), userId});

                if (flectRows == 0) {
                    LOGGER.error("订阅单独的三级分类出错,更新数据库userFocusId错误,更新关注字符串userFocusId: " + userFocusJsonObject.toString());
                    return false;
                }
                // 更新三级分类的关注数
                sqlStr = "UPDATE type_info SET collectedNumber=collectedNumber+1 WHERE secondType=? AND thirdTypeName=?";
                flectRows = jdbcTemplate.update(sqlStr, secondType, thirdTypeName);
                if (flectRows == 0) {
                    LOGGER.error("订阅单独的三级分类出错,更新该三级分类关注数出错,secondType: " + secondType + ",thirdTypeName: " + thirdTypeName);
                }
                break;
            }
        }
        return true;
    }

    //TODO: 取消订阅单独的三级分类
    /**
     * 取消订阅单独的三级分类
     *
     * @param userId
     * @param secondType
     * @param thirdTypeName
     * @return
     */
    @Override
    public boolean removeSubscri(int userId, int secondType, String thirdTypeName) {
        String sqlStr = "";
        int firstType = -1;
        String userFocusListStr = "";

        LOGGER.error("要删除的三级分类：secondType: "+secondType+",thirdTypeName: "+thirdTypeName);

        /**
         * 1. 查找三级分类所属的一级分类id
         */
        try {
            firstType = jdbcTemplate.queryForObject(SQLAccess.SelectFirstTypeOfThirdType, new Object[]{secondType, thirdTypeName}, Integer.class);
        } catch (EmptyResultDataAccessException exception) {
            LOGGER.error("订阅单独的三级分类出错,找不到此三级分类的id,secondType: " + secondType + ",thirdTypeName: " + thirdTypeName);
            return false;
        }

        /**
         * 2. 根据userId获得用户关注字符串
         */
        try {
            userFocusListStr = jdbcTemplate.queryForObject(SQLAccess.SelectUserFocusInfo, new Object[]{userId}, String.class);
        } catch (EmptyResultDataAccessException exception) {
            LOGGER.error("订阅单独的三级分类出错,根据userId找不到用户,userId: " + userId);
            return false;
        }

        /**
         * 3. 把分类从用户的关注列表里面去除
         */
        String jsonStr = "{\"secondType\":" + secondType + ",\"thirdTypeName\":\"" + thirdTypeName + "\"}";
        JSONObject userFocusJsonObject = JSONObject.fromObject(userFocusListStr); // 用户关注Json对象
        JSONArray userFocusJsonArray = userFocusJsonObject.getJSONArray("focusList");

        for (int i = 0; i < userFocusJsonArray.size(); i++) {
            JSONObject firstFocusObject = userFocusJsonArray.getJSONObject(i); // 用户某一级分类关注Json对象
            int itemNumber = firstFocusObject.getInt("itemNumber");
            // 如果找到要更新的一级分类
            if (itemNumber == firstType) {
                JSONArray focusJsonArray = firstFocusObject.getJSONArray("focus"); // 用户在该一级分类下的关注Json数组
                if (!focusJsonArray.toString().contains(thirdTypeName)) {
                    // 如果用户并没有关注该三级分类,这种情况本不该存在的
                    return false;
                }

                /**
                 * 4. 更新该一级分类下的关注项目
                 */
                for(int i1=0;i1<focusJsonArray.size();i1++){
                    // 如果找到关注里面相同的三级分类
                    if(secondType==(int)focusJsonArray.getJSONObject(i1).get("secondType")){
                        if(thirdTypeName.equals((String)focusJsonArray.getJSONObject(i1).get("thirdName"))){
                            focusJsonArray.remove(focusJsonArray.get(i1));
                        }
                    }
                }

                int flectRows = jdbcTemplate.update(SQLAccess.UpdateUserFocusInfo, new Object[]{userFocusJsonObject.toString(), userId});

                if (flectRows == 0) {
                    LOGGER.error("取消订阅单独的三级分类出错,更新数据库userFocusId错误,更新关注字符串userFocusId: " + userFocusJsonObject.toString());
                    return false;
                }
                // 更新三级分类的关注数
                flectRows = jdbcTemplate.update(SQLAccess.UpdateThirdTypeCollectNumberMinus, secondType, thirdTypeName);
                if (flectRows == 0) {
                    LOGGER.error("取消订阅单独的三级分类出错,更新该三级分类关注数出错,secondType: " + secondType + ",thirdTypeName: " + thirdTypeName);
                }
                break;
            }
        }
        return true;
    }

    /**
     * TODO: 更改用户订阅排序
     *
     * @param userId
     * @param updateUserSubscriOrderStr
     * @return
     */
    @Override
    public boolean updateUserSubscriOrder(int userId, String updateUserSubscriOrderStr) {
        JSONObject jsonObject = JSONObject.fromObject(updateUserSubscriOrderStr);
        JSONArray updateJsonArray = jsonObject.getJSONArray("updateUserSubscriOrder");
        boolean updateResult = true;

        /**
         * 1. 获取用户关注列表对应的JSON对象
         */
        String userFocusListString = "";

        try {
            userFocusListString = jdbcTemplate.queryForObject(SQLAccess.SelectUserFocusInfo,
                    String.class, new Object[]{userId});
        } catch (EmptyResultDataAccessException exception) {
            //获取错误
            LOGGER.error("更新用户关注列表,获取用户现有关注列表失败...", exception);
            return false;
        }

        JSONObject userFocusJsonObject = JSONObject.fromObject(userFocusListString);
        JSONArray userFocusJsonArray = userFocusJsonObject.getJSONArray("focusList");


        /**
         * 2. 开始更新用户关注列表对应的JSON对象
         */
        // 更新各个一级分类的订阅排序
        for (int i = 0; i < updateJsonArray.size(); i++) {
            JSONObject firstUpdate = updateJsonArray.getJSONObject(i);
            int firstType = firstUpdate.getInt("firstType");
            JSONArray secondTypeOrder = firstUpdate.getJSONArray("secondTypeOrder");
            JSONArray thirdTypeOrder = firstUpdate.getJSONArray("thirdTypeOrder");

            // 找到需要更新的一级分类
            for (int j = 0; j < userFocusJsonArray.size(); j++) {
                JSONObject jsonObject1 = userFocusJsonArray.getJSONObject(j);
                int itemNumber = jsonObject1.getInt("itemNumber");

                if (itemNumber == firstType) {
                    // 用户在当前一级分类下关注列表
                    JSONArray focus = jsonObject1.getJSONArray("focus");

                    // 更新二级排序
                    if (!secondTypeOrder.isEmpty()) {
                        for (int i1=0; i1 < secondTypeOrder.size(); i1++) {
                            JSONObject secondTypeJson = secondTypeOrder.getJSONObject(i1);

                            for (int k = 0; k < focus.size(); k++) {
                                JSONObject jsonObject2 = focus.getJSONObject(k);

                                if (jsonObject2.getInt("secondType") == secondTypeJson.getInt("secondType")){
                                    jsonObject2.put("secondTypeOrder",secondTypeJson.getInt("secondTypeOrder"));
                                }
                            }
                        }
                    }

                    // 更新三级排序
                    if(!thirdTypeOrder.isEmpty()){
                        for(int i1=0;i1<thirdTypeOrder.size();i1++){
                            JSONObject thirdTypeJson = thirdTypeOrder.getJSONObject(i1);

                            for(int k=0;k<focus.size();k++){
                                JSONObject jsonObject2 = focus.getJSONObject(k);
                                if(jsonObject2.getInt("secondType") == thirdTypeJson.getInt("secondType")){
                                    jsonObject2.put("thirdNameList",thirdTypeJson.get("thirdNameList"));
                                }
                            }
                        }
                    }
                }
            }


        }

        /**
         * 3. 把更新后的关注列表存储到数据库
         */
        //更新用户关注数据库数据
        int result = jdbcTemplate.update(SQLAccess.UpdateUserFocusInfo,
                new Object[]{userFocusJsonObject.toString(),userId});

        updateResult = (result > 0 ? true : false);
        return updateResult;
    }
}
